package CONTABILIDAD_MODELO;

import Conexion.Conexion;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.StringTokenizer;

public class CON_FECHA_CIERRE {

    private Double ID;
    private Double ANO;
    private Double MES;
    private int ESTADO;
    private Date FECHA_CIERRE;
    private Conexion con = null;

    public CON_FECHA_CIERRE() {
    }

    
    
    public CON_FECHA_CIERRE(Double ID, Double ANO, Double MES, Date FECHA_CIERRE) {
        this.ID = ID;
        this.ANO = ANO;
        this.MES = MES;
        this.FECHA_CIERRE = FECHA_CIERRE;
    }
    
    public boolean generar_CIERRE(int ano, int mes)
    {        
        try
        {
            if(isCierre(ano, mes))
            {
                return CerrarMes(ano, mes);
            }
            else
            {
                if(mes==13)
                {
                    mes=1;
                    ano++;
                }
                else
                {
                    mes=mes;
                }
                this.setANO((double)ano);
                this.setMES((double)mes);
                Date dt=Calendar.getInstance().getTime();
                this.setFECHA_CIERRE(dt);
                this.setID(0.0);
                return this.Insertar();  
            }            
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }        
    
    public boolean Insertar() {
        try {
            String consulta = "insert into BROKER.CON_FECHA_CIERRE(ID, ANO, MES, FECHA_CIERRE) VALUES (" + ID + "," + ANO + "," + MES + ", to_date('"+getFECHA_CIERRE_String()+"', 'dd/MM/YYYY HH:mi:SS'))";
            con.EjecutarSentencia(consulta);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    public boolean AbrirMes(int mes, int ano) {
        try {
            String consulta = "update BROKER.CON_FECHA_CIERRE set ESTADO = 1 where ANO= "+ano+" and MES = "+mes;
            con.EjecutarSentencia(consulta);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    
    public boolean CerrarMes(int ano, int mes) {
        try {
            String consulta = "update BROKER.CON_FECHA_CIERRE set ESTADO = 0 where ANO = "+ano+" and MES = "+mes;
            con.EjecutarSentencia(consulta);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public CON_FECHA_CIERRE Buscar(int mes, int ano) throws SQLException {
        
            String consulta = "select * from BROKER.CON_FECHA_CIERRE where ano = "+ano+" and mes ="+mes;
            ResultSet rs =con.EjecutarConsulta(consulta);
            List<CON_FECHA_CIERRE> lista =Cargar(rs);
            if(lista.size()>0)
                return lista.get(0);
            else
                return null;
        
    }
    public double primerAño() {
        try {
            String consulta = "select min(ANO) as ano from BROKER.CON_FECHA_CIERRE";
            ResultSet rs = con.EjecutarConsulta(consulta);
            rs.next();
            double año=rs.getDouble("ano");
            return año;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
    public double ultimoAño() {
        try {
            String consulta = "select max(ANO) as ano from BROKER.CON_FECHA_CIERRE";
            ResultSet rs = con.EjecutarConsulta(consulta);
            double año=0;
            if(rs.next()){
            año=rs.getDouble("ano");
            }
            return año;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
   
    public List<CON_FECHA_CIERRE> cierreXAño(double año) {
        try {
            String consulta = "select * from BROKER.CON_FECHA_CIERRE where ANO="+año+" ORDER BY MES";
            ResultSet rs = con.EjecutarConsulta(consulta);
            return Cargar(rs);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public int mesActual(){
        try
        {
            String consulta =   "SELECT DISTINCT ( (SELECT (C.MES) FROM BROKER.CON_FECHA_CIERRE C WHERE C.ESTADO=1 ) ||'-'||ANO ) AS CODIGO FROM BROKER.CON_FECHA_CIERRE where ESTADO=1";
            ResultSet rs = con.EjecutarConsulta(consulta);
            
            boolean a = rs.next();
            
            if(!a)
            {
                consulta =  "SELECT DISTINCT ( \n" +
                            "               (SELECT \n" +
                            "                TO_NUMBER (MAX(C.MES))+1  \n" +
                            "                 FROM BROKER.CON_FECHA_CIERRE C\n" +
                            "                 where \n" +
                            "                          ID=(SELECT MAX(A.ID) FROM BROKER.CON_FECHA_CIERRE A )\n" +
                            "                 ) ||'-'||ANO) AS CODIGO\n" +
                            "       FROM BROKER.CON_FECHA_CIERRE \n" +
                            "       WHERE ID=(SELECT MAX(B.ID) FROM BROKER.CON_FECHA_CIERRE B )";
                rs = con.EjecutarConsulta(consulta);
                rs.next();
            }
             
            String as = rs.getString("CODIGO");
            StringTokenizer token = new StringTokenizer(as, "-");

            int mes=Integer.parseInt(token.nextToken());
            int ano=Integer.parseInt(token.nextToken());       

            if(mes==13)
            {
                mes=1;
                ano++;
            }
            return mes;
        }
        catch(Exception e)
        {
            Calendar calendar = new GregorianCalendar();
            return 1;
        }
    }
    public int anoActual(){
        try
        {
            String consulta =   "SELECT DISTINCT ( (SELECT (C.MES) FROM BROKER.CON_FECHA_CIERRE C WHERE C.ESTADO=1 ) ||'-'||ANO ) AS CODIGO FROM BROKER.CON_FECHA_CIERRE where ESTADO=1";
            ResultSet rs = con.EjecutarConsulta(consulta);
            
            boolean a = rs.next();
            
            if(!a)
            {
                consulta =  "SELECT \n" +
                            "( (SELECT \n" +
                            "TO_NUMBER \n" +
                            "(MAX(C.MES))+1  \n" +
                            "FROM BROKER.CON_FECHA_CIERRE C\n" +
                            "where ID=(SELECT MAX(A.ID) FROM BROKER.CON_FECHA_CIERRE A )\n" +
                            ") ||'-'||ANO) AS CODIGO\n" +
                            "FROM BROKER.CON_FECHA_CIERRE \n" +
                            "WHERE ID=(SELECT MAX(A.ID) FROM BROKER.CON_FECHA_CIERRE A )";
                rs = con.EjecutarConsulta(consulta);
                rs.next();
            }
             
            String as = rs.getString("CODIGO");
            StringTokenizer token = new StringTokenizer(as, "-");

            int mes=Integer.parseInt(token.nextToken());
            int ano=Integer.parseInt(token.nextToken());       

            if(mes==13)
            {
                mes=1;
                ano++;
            }
            return ano;
        }
        catch(Exception e)
        {
            Calendar calendar = new GregorianCalendar();
            return calendar.get(Calendar.YEAR);
        }
    }
    public boolean isCierre(int ano, int mes) throws SQLException 
    {
            String consulta =   "select * from BROKER.CON_FECHA_CIERRE where ano = "+ano+" and mes = "+mes;
            ResultSet rs = con.EjecutarConsulta(consulta);            
            boolean algo = rs.next();
            if(algo)            
                return true;
            else
                return false;
    }

    public String getMes(int mes)
    {
        String meses = "Ningun Mes";
        switch(mes)
        {
            case 1:
                meses = "Enero";
                break;            
            case 2:
                meses = "Febrero";
                break;            
            case 3:
                meses = "Marzo";
                break;            
            case 4:
                meses = "Abril";
                break;            
            case 5:
                meses = "Mayo";
                break;            
            case 6:
                meses = "Junio";
                break;            
            case 7:
                meses = "Julio";
                break;            
            case 8:
                meses = "Agosto";
                break;            
            case 9:
                meses = "Septiembre";
                break;            
            case 10:
                meses = "Octubre";
                break;            
            case 11:
                meses = "Noviembre";
                break;            
            case 12:
                meses = "Diciembre";
                break;            
        }        
        return meses;
    }
    
    public List<CON_FECHA_CIERRE> Cargar(ResultSet rs) {
        try {
            List<CON_FECHA_CIERRE> lista = new ArrayList<CON_FECHA_CIERRE>();
            while (rs.next()) {
                CON_FECHA_CIERRE objeto = new CON_FECHA_CIERRE();
                objeto.setID(rs.getDouble("ID"));
                objeto.setANO(rs.getDouble("ANO"));
                objeto.setMES(rs.getDouble("MES"));
                objeto.setESTADO(rs.getInt("ESTADO"));
                objeto.setFECHA_CIERRE(rs.getDate("FECHA_CIERRE"));
                objeto.setCon(con);
                lista.add(objeto);
            }
            return lista;
        } catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public Double getID() {
        return ID;
    }

    public void setID(Double ID) {
        this.ID = ID;
    }

    public Double getANO() {
        return ANO;
    }

    public void setANO(Double ANO) {
        this.ANO = ANO;
    }

    public Double getMES() {
        return MES;
    }

    public void setMES(Double MES) {
        this.MES = MES;
    }

    public int getESTADO() {
        return ESTADO;
    }

    public void setESTADO(int ESTADO) {
        this.ESTADO = ESTADO;
    }

    public String getFECHA_CIERRE_String() {
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/YYYY hh:mm:ss");
        return format.format(FECHA_CIERRE);
    }
    public Date getFECHA_CIERRE() {
        return FECHA_CIERRE;
    }

    public void setFECHA_CIERRE(Date FECHA_CIERRE) {
        this.FECHA_CIERRE = FECHA_CIERRE;
    }

    public Conexion getCon() {
        return con;
    }

    public void setCon(Conexion con) {
        this.con = con;
    }
    
}
